package org.example.lys.utils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class SensitiveWordInit {
    /**
     * @param list：从数据库获取到的敏感词汇列表
     * @return 敏感词汇HashMap
     * 备注：原作者的入参是Set<String>，我改成了List.
     * 改完后才发现作者的用心，Set的效率比List高
     * @Description: 初始化敏感词库，将敏感词加入到HashMap中，构建DFA算法模型
     */
    public HashMap getSensitiveWordToHashMap(List<String> list) {

        //敏感词汇map
        HashMap sensitiveWordMap = new HashMap<>();
        //关键字
        String key = "";
        //转换map
        Map tempMap = null;
        //给临时map赋值
        Map newMap = null;

        //迭代器
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            //取出关键词
            key = it.next();
            //这里给输出map赋值
            tempMap = sensitiveWordMap;

            //拆分关键词，存入map
            for (int i = 0; i < key.length(); i++) {
                //由于key是字符串型，所以里面存放的是字符型，因此存在如下取法
                //备注：其实这里可以将key转成array,用array[i]取还是一样
                char keyChar = key.charAt(i);

                //从转换map里面取出单个"关键字"，多个关键字组成关键词
                //备注：这里可以使用String类型来接收
                Object tmpKey = tempMap.get(keyChar);
                //如果tmpKey里面存在该key，直接赋值
                if (tmpKey != null) {
                    tempMap = (Map) tmpKey;
                } else {
                    /**
                     * 如果不存在该key，则添加进去
                     */
                    //新构建一个map,将isEnd设值0，因为它不是最后一个
                    newMap = new HashMap<>();
                    //不是最后一个
                    newMap.put("isEnd", 0);
                    //将该key添加到tempMap，实际上是添加到sensitiveWordMap中
                    //这里涉及到一个地址引用的知识点
                    tempMap.put(keyChar, newMap);
                    //重新使tempMap指向newMap
                    tempMap = newMap;
                }
                //最后一个
                if (i == key.length() - 1) {
                    tempMap.put("isEnd", "1");
                }
            }
        }

        //返回敏感词汇map
        return sensitiveWordMap;
    }
}
